
https://rss.onlinelibrary.wiley.com/doi/10.1111/j.1740-9713.2018.01169.x
R paketleri
Paketleri nereden bulabiliriz
Kendi paket evrenini oluştur
R paket yükleme
install.packages("tidyverse", dependencies = TRUE)
install.packages("jmv", dependencies = TRUE)
install.packages("questionr", dependencies = TRUE)
install.packages("Rcmdr", dependencies = TRUE)
install.packages("summarytools")
Veriyi görüntüleme
View(data)
data
head
tail
glimpse
str
skimr::skim()
Veriyi değiştirme
Veriyi kod ile değiştirelim
Veriyi eklentilerle değiştirme

Basit tanımlayıcı istatistikler
summary()
mean
median
min
max
sd
table()
library(readr)
irisdata <- read_csv("data/iris.csv")
jmv::descriptives(
data = irisdata,
vars = "Sepal.Length",
splitBy = "Species",
freq = TRUE,
hist = TRUE,
dens = TRUE,
bar = TRUE,
box = TRUE,
violin = TRUE,
dot = TRUE,
mode = TRUE,
sum = TRUE,
sd = TRUE,
variance = TRUE,
range = TRUE,
se = TRUE,
skew = TRUE,
kurt = TRUE,
quart = TRUE,
pcEqGr = TRUE)
skimr
library(skimr)
skim(df)
DataExplorer
library(DataExplorer)
DataExplorer::create_report(df)

Grafikler
descr(tobacco, style = 'rmarkdown')
print(descr(tobacco), method = 'render', table.classes = 'st-small')
dfSummary(tobacco, style = 'grid', plain.ascii = FALSE)
print(dfSummary(tobacco, graph.magnif = 0.75), method = 'render')

Sonraki Konular
- RStudio ile GitHub
- Hipotez testleri
- R Markdown ve R Notebook ile tekrarlanabilir rapor
LS0tCnRpdGxlOiBSIGlsZSBhbmFsaXplIGJhxZ9sYXJrZW5eW0J1IGJpciBkZXJsZW1lZGlyLCBtw7xta8O8biBtZXJ0ZWJlIGFsxLFudMSxbGFyYSByZWZlcmFucwogIHZlcm1leWUgw6dhbMSxxZ90xLFtLl0KYXV0aG9yOiAiRGVybGV5ZW4gW1NlcmRhciBCYWxjxLEsIE1ELCBQYXRob2xvZ2lzdF0oaHR0cHM6Ly9zYmFsY2kuZ2l0aHViLmlvLykiCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSlgIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIGhpZ2hsaWdodDoga2F0ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRoZW1lOiBmbGF0bHkKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDUKICAgIHRvY19mbG9hdDogeWVzCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogJzUnCiAgaHRtbF9kb2N1bWVudDogCiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBrZWVwX21kOiB5ZXMKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDUKICAgIHRvY19mbG9hdDogeWVzCi0tLQoKPCEtLSBPcGVuIGFsbCBsaW5rcyBpbiBuZXcgdGFiLS0+ICAKPGJhc2UgdGFyZ2V0PSJfYmxhbmsiLz4gICAKCgo8IS0tIEdvIHRvIHd3dy5hZGR0aGlzLmNvbS9kYXNoYm9hcmQgdG8gY3VzdG9taXplIHlvdXIgdG9vbHMgLS0+IDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii8vczcuYWRkdGhpcy5jb20vanMvMzAwL2FkZHRoaXNfd2lkZ2V0LmpzI3B1YmlkPXJhLTViYzM2OTAwYTQwNTA5MGIiPiAgCjwvc2NyaXB0PiAKCgoKClshW10oaHR0cDovL3Jlcy5jbG91ZGluYXJ5LmNvbS9keWQ5MTFrbWgvaW1hZ2UvdXBsb2FkL2ZfYXV0byxxX2F1dG86YmVzdC92MTUzMDExMzA3Ny9JbWFnZV8yX3ZmeTQ4Yi5wbmcpXShodHRwczovL3d3dy5kYXRhY2FtcC5jb20vY29tbXVuaXR5L3R1dG9yaWFscy9kYXRhLXNjaWVuY2UtcGl0ZmFsbHMpCgoKLSBSIGdlbmVyYXRpb24KCmh0dHBzOi8vcnNzLm9ubGluZWxpYnJhcnkud2lsZXkuY29tL2RvaS8xMC4xMTExL2ouMTc0MC05NzEzLjIwMTguMDExNjkueAoKCiMgUiB5w7xrbGVtZQoKaHR0cDovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PVhjQkxFVmtucXZZCgpbIVtXaGF0IGlzIFI/XShodHRwOi8vaW1nLnlvdXR1YmUuY29tL3ZpL1hjQkxFVmtucXZZLzAuanBnKV0oaHR0cDovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PVhjQkxFVmtucXZZKQoKCiMjIFItcHJvamVjdAoKaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvCgotLS0KClshW10oaHR0cHM6Ly9pc21heWMuZ2l0aHViLmlvL3RhbGtzL25lc3MtaW5mZXIvaW1nL2VuZ2luZS5wbmcpXShodHRwczovL2lzbWF5Yy5naXRodWIuaW8vdGFsa3MvbmVzcy1pbmZlci9zbGlkZV9kZWNrLmh0bWwjNikKCi0tLQoKIyMgUlN0dWRpbwoKaHR0cHM6Ly93d3cucnN0dWRpby5jb20vCgpodHRwczovL3d3dy5yc3R1ZGlvLmNvbS9wcm9kdWN0cy9yc3R1ZGlvL2Rvd25sb2FkLwoKaHR0cHM6Ly9tb2Rlcm5kaXZlLmNvbS8yLWdldHRpbmctc3RhcnRlZC5odG1sCgotLS0KClshW10oaHR0cDovL3d3dy11c2Vycy55b3JrLmFjLnVrL35lcjEzL1JTdHVkaW8lMjBBbmF0b215LnN2ZyldKGh0dHBzOi8vYnV6enJiZWVsaW5lLmJsb2cvMjAxOC8wNy8wNC9yc3R1ZGlvLWFuYXRvbXkvKQoKCgotLS0KCiMjIyBSU3R1ZGlvIGVrbGVudGlsZXJpCgotIERpc2NvdmVyIGFuZCBpbnN0YWxsIHVzZWZ1bCBSU3R1ZGlvIGFkZGlucwoKaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL2FkZGluc2xpc3QvUkVBRE1FLmh0bWwKCmh0dHBzOi8vcnN0dWRpby5naXRodWIuaW8vcnN0dWRpb2FkZGlucy8KCgpgYGB7cn0KIyBkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoInJzdHVkaW8vYWRkaW5leGFtcGxlcyIsIHR5cGUgPSAic291cmNlIikKYGBgCgoKLS0tCgojIyBYMTEKCmh0dHBzOi8vd3d3LnhxdWFydHoub3JnLwoKLS0tCgojIyBKYXZhIE9TCgpodHRwczovL3N1cHBvcnQuYXBwbGUuY29tL2tiL2RsMTU3MgoKLS0tCgoKIyBSIHpvciDFn2V5bGVyIGnDp2luIGtvbGF5LCBrb2xheSDFn2V5bGVyIGnDp2luIHpvcgoKCi0gW1IgbWFrZXMgZWFzeSB0aGluZ3MgaGFyZCwgYW5kIGhhcmQgdGhpbmdzIGVhc3ldKGh0dHA6Ly9yNHN0YXRzLmNvbS9hcnRpY2xlcy93aHktci1pcy1oYXJkLXRvLWxlYXJuLykKCgotIEF5bsSxIMWfZXlpIMOnb2sgZmF6bGEgxZ9la2lsZGUgeWFwbWFrIG3DvG1rw7xuCgpSIFN5bnRheCBDb21wYXJpc29uOjpDSEVBVCBTSEVFVAoKaHR0cHM6Ly93d3cuYW1lbGlhLm1uL1N5bnRheC1jaGVhdHNoZWV0LnBkZgoKCgoKPGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+PGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL1JTdGF0cz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I1JTdGF0czwvYT4g4oCUIFRoZXJlIGFyZSBhbHdheXMgc2V2ZXJhbCB3YXlzIHRvIGRvIHRoZSBzYW1lIHRoaW5nLi4uIG5pY2UgZXhhbXBsZSBvbiB3aXRoIHRoZSBpZGVudGl0eSBtYXRyaXggYnkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9UZWFTdGF0cz9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5AVGVhU3RhdHM8L2E+IDxhIGhyZWY9Imh0dHBzOi8vdC5jby9PM0dYZFBpTTMyIj5odHRwczovL3QuY28vTzNHWGRQaU0zMjwvYT48L3A+Jm1kYXNoOyBDb2xpbiBGYXkg8J+kmCAoQF9Db2xpbkZheSkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9fQ29saW5GYXkvc3RhdHVzLzExMTI3NDY2MzM0Njc1MTg5Nzc/cmVmX3NyYz10d3NyYyU1RXRmdyI+QXByaWwgMSwgMjAxOTwvYT48L2Jsb2NrcXVvdGU+CjxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KCgoKCgoKCgoKCi0tLQoKCiMgUiBwYWtldGxlcmkKCgojIyBOZWRlbiBwYWtldGxlciB2YXIKClshW10oaHR0cHM6Ly9pc21heWMuZ2l0aHViLmlvL3RhbGtzL25lc3MtaW5mZXIvaW1nL2FwcHN0b3JlLnBuZyldKGh0dHBzOi8vaXNtYXljLmdpdGh1Yi5pby90YWxrcy9uZXNzLWluZmVyL3NsaWRlX2RlY2suaHRtbCM3KQoKLS0tCgo8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+PGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+SSBsb3ZlIHRoZSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jcnN0YXRzPC9hPiBjb21tdW5pdHkuPGJyPlNvbWVvbmUgaXMgbGlrZSwgJnF1b3Q7b2ggaGV5IHBlZXBzLCBJIHNhdyBhIGJpZyBuZWVkIGZvciB0aGlzIG11bmRhbmUgYnV0IGRpZmZpY3VsdCB0YXNrIHRoYXQgSSBpbmZyZXF1ZW50bHkgZG8sIHNvIEkgY3JlYXRlZCBhIHBhY2thZ2UgdGhhdCB3aWxsIGxpdGVyYWxseSBzY3JhcGUgdGhlIGxhc3QgYml0cyBvZiBwZWFudXQgYnV0dGVyIG91dCBvZiB0aGUgamFyIGZvciB5b3UuIEl0JiMzOTtzIGNhbGxlZCBwYnBseXIuJnF1b3Q7PGJyPldoYXQgYSB0cmliZS48L3A+Jm1kYXNoOyBGcmFuayBFbGF2c2t5IOG0sOG1g+G1l+G1gyDhtYLhtqbhtrvhtYPKs+G1iCAoQEZyYW5rbHlfRGF0YSkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9GcmFua2x5X0RhdGEvc3RhdHVzLzEwMTQxODkwOTUyOTQyOTE5Njg/cmVmX3NyYz10d3NyYyU1RXRmdyI+SnVseSAzLCAyMDE4PC9hPjwvYmxvY2txdW90ZT4KCi0tLQoKCgpodHRwczovL2Jsb2cubWl0Y2hlbGxvaGFyYXdpbGQuY29tL2Jsb2cvdXNlci0yMDE4LWZlYXR1cmUtd2FsbC8KCi0tLQoKIVtdKGh0dHBzOi8vYmxvZy5taXRjaGVsbG9oYXJhd2lsZC5jb20vYmxvZy8yMDE4LTA3LTExLXVzZXItMjAxOC1mZWF0dXJlLXdhbGxfZmlsZXMvZmluYWwuanBnKQoKLS0tCgojIyBQYWtldGxlcmkgbmVyZWRlbiBidWxhYmlsaXJpegoKLSBBdmFpbGFibGUgQ1JBTiBQYWNrYWdlcyBCeSBOYW1lICAKaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL2F2YWlsYWJsZV9wYWNrYWdlc19ieV9uYW1lLmh0bWwKCi0gQ1JBTiBUYXNrIFZpZXdzICAKaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3ZpZXdzLwoKLSBCaW9jb25kdWN0b3IgIApodHRwczovL3d3dy5iaW9jb25kdWN0b3Iub3JnCgotIFJlY29tbWVuZFIgIApodHRwOi8vcmVjb21tZW5kci5pbmZvLwoKLSBwa2dzZWFyY2ggIApDUkFOIHBhY2thZ2Ugc2VhcmNoICAKaHR0cHM6Ly9naXRodWIuY29tL21ldGFjcmFuL3BrZ3NlYXJjaAoKLSBDUkFOc2VhcmNoZXIgIApodHRwczovL2dpdGh1Yi5jb20vUmhvSW5jL0NSQU5zZWFyY2hlciAgCgotIEF3ZXNvbWUgUiAgCmh0dHBzOi8vYXdlc29tZS1yLmNvbS8gIAoKCiMjIEtlbmRpIHBha2V0IGV2cmVuaW5pIG9sdcWfdHVyCgotIHBrZ3ZlcnNlOiBCdWlsZCBhIE1ldGEtUGFja2FnZSBVbml2ZXJzZSAgCmh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9wa2d2ZXJzZS9pbmRleC5odG1sCgoKLS0tCgojIyBSIHBha2V0IHnDvGtsZW1lCgpgYGAKaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKaW5zdGFsbC5wYWNrYWdlcygiam12IiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKaW5zdGFsbC5wYWNrYWdlcygicXVlc3Rpb25yIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKaW5zdGFsbC5wYWNrYWdlcygiUmNtZHIiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQppbnN0YWxsLnBhY2thZ2VzKCJzdW1tYXJ5dG9vbHMiKQpgYGAKCmBgYHtyIHBha2V0IHnDvGtsZW1lfQojIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCiMgaW5zdGFsbC5wYWNrYWdlcygiam12IiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKIyBpbnN0YWxsLnBhY2thZ2VzKCJxdWVzdGlvbnIiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQojIGluc3RhbGwucGFja2FnZXMoIlJjbWRyIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKIyBpbnN0YWxsLnBhY2thZ2VzKCJzdW1tYXJ5dG9vbHMiKQpgYGAKCgpgYGB7ciBwYWtldCBjYWdpcm1hLCBlcnJvcj1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGV2YWwgPSBUUlVFLCBpbmNsdWRlID0gVFJVRX0KIyByZXF1aXJlKHRpZHl2ZXJzZSkKIyByZXF1aXJlKGptdikKIyByZXF1aXJlKHF1ZXN0aW9ucikKIyBsaWJyYXJ5KHN1bW1hcnl0b29scykKIyBsaWJyYXJ5KGdnYW5pbWF0ZSkKYGBgCgoKCi0tLQoKIyBSIGnDp2luIHlhcmTEsW0gYnVsbWEKCgpgYGB7ciB5YXJkxLFtfQojID9tZWFuCiMgPz9lZmV0Y2gKIyBoZWxwKG1lcmdlKQojIGV4YW1wbGUobWVyZ2UpCmBgYAoKCgotIFZpZ25ldHRlCgohW10oZmlndXJlcy92aWduZXR0ZS5wbmcpCgotLS0KCi0gUkRvY3VtZW50YXRpb24KaHR0cHM6Ly93d3cucmRvY3VtZW50YXRpb24ub3JnCgotIFIgUGFja2FnZSBEb2N1bWVudGF0aW9uCmh0dHBzOi8vcmRyci5pby8KCi0gR2l0SHViCgotIFN0YWNrb3ZlcmZsb3cKCmh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vCgotIEdvb2dsZSB1eWd1biBhbmFodGFyIGtlbGltZQoKCgo8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+PGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+SG93IEkgdXNlIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9yc3RhdHM/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNyc3RhdHM8L2E+IDxicj5oL3QgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9UaGVQcmFjdGljYWxEZXY/cmVmX3NyYz10d3NyYyU1RXRmdyI+QFRoZVByYWN0aWNhbERldjwvYT4gPGEgaHJlZj0iaHR0cHM6Ly90LmNvL2VyUm5URzBVanIiPnBpYy50d2l0dGVyLmNvbS9lclJuVEcwVWpyPC9hPjwvcD4mbWRhc2g7IEVtaWx5IEJvdmVlIChAZWJvdmVlMDkpIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vZWJvdmVlMDkvc3RhdHVzLzEwMjgwMzc1OTQ5NDc0ODU2OTY/cmVmX3NyYz10d3NyYyU1RXRmdyI+QXVndXN0IDEwLCAyMDE4PC9hPjwvYmxvY2txdW90ZT4KCgotLS0KCgohW10oZmlndXJlcy9Hb29nbGUtcGFja2FnZS1uYW1lLnBuZykKCi0tLQoKCgohW10oZmlndXJlcy9Hb29nbGUtc3RhcnQtd2l0aC1SLnBuZykKCi0tLQoKLSBHb29nbGUnZGEgYXJhcmtlbiBgW1JdYCB5YXptYWsgZGEgacWfZSB5YXJheWFiaWxpeW9yLgoKCi0tLQoKLSBzZWFyY2hlciBwYWNrYWdlIPCfk6YKCgpbIVtdKGh0dHBzOi8vY2Ftby5naXRodWJ1c2VyY29udGVudC5jb20vMTJmMGUyZDE4MDQ3ZjFiNWYzNmZiZWIwOWExZDBlNTQ4MjM2ODgzZi82ODc0NzQ3MDczM2EyZjJmNjkyZTY5NmQ2Nzc1NzIyZTYzNmY2ZDJmNWE3MTMyNzI2NzM2NDcyZTY3Njk2NildKGh0dHBzOi8vZ2l0aHViLmNvbS9jb2F0bGVzcy9zZWFyY2hlcikKCgoKLS0tCgotIEF3ZXNvbWUgQ2hlYXRzaGVldApodHRwczovL2dpdGh1Yi5jb20vZGV0YWlseWFuZy9hd2Vzb21lLWNoZWF0c2hlZXQKCmh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmcvZG9jL2NvbnRyaWIvQmFnZ290dC1yZWZjYXJkLXYyLnBkZgoKaHR0cHM6Ly93d3cucnN0dWRpby5jb20vcmVzb3VyY2VzL2NoZWF0c2hlZXRzLwoKCi0gQXdlc29tZSBSCgpodHRwczovL2dpdGh1Yi5jb20vcWlud2YvYXdlc29tZS1SI3JlYWRtZQoKaHR0cHM6Ly9hd2Vzb21lLXIuY29tLwoKCgoKLSBUd2l0dGVyCgpodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzP3NyYz1oYXNoCgoKLSBSZXByb2R1Y2libGUgRXhhbXBsZXMgIAoKPGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+R290IGEgcXVlc3Rpb24gdG8gYXNrIG9uIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vU2xhY2tIUT9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5AU2xhY2tIUTwvYT4gb3IgcG9zdCBvbiA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2dpdGh1Yj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5AZ2l0aHViPC9hPj8gTm8gdGltZSB0byByZWFkIHRoZSBsb25nIHBvc3Qgb24gaG93IHRvIHVzZSByZXByZXg/IEhlcmUgaXMgYSAyMC1zZWNvbmQgZ2lmIGZvciB5b3UgdG8gZm9ybWF0IHlvdXIgUiBjb2RlcyBuaWNlbHkgYW5kIGZvciBvdGhlcnMgdG8gcmVwcm9kdWNlIHlvdXIgcHJvYmxlbS4gKEFuIGV4YW1wbGUgZnJvbSBhIHRhbGsgZ2l2ZW4gYnkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9KZW5ueUJyeWFuP3JlZl9zcmM9dHdzcmMlNUV0ZnciPkBKZW5ueUJyeWFuPC9hPikgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL3JzdGF0P3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jcnN0YXQ8L2E+IDxhIGhyZWY9Imh0dHBzOi8vdC5jby9ncHVHWHBGSXNYIj5waWMudHdpdHRlci5jb20vZ3B1R1hwRklzWDwvYT48L3A+Jm1kYXNoOyBaaGlZYW5nIChAemhpaWl5YW5nKSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL3poaWlpeWFuZy9zdGF0dXMvMTA1MzAwNjAwMzcxMTU2OTkyMD9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5PY3RvYmVyIDE4LCAyMDE4PC9hPjwvYmxvY2txdW90ZT48c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CgoKLSBLZWVwaW5nIHVwIHRvIGRhdGUgd2l0aCBSIG5ld3MgIApodHRwczovL21hc2FsbW9uLmV1LzIwMTkvMDEvMjUvdXB0b2RhdGUvICAKCi0tLQoKIyBSIHN0dWRpbyBpbGUgcHJvamUgb2x1xZ90dXJtYQoKaHR0cHM6Ly9zdXBwb3J0LnJzdHVkaW8uY29tL2hjL2VuLXVzL2FydGljbGVzLzIwMDUyNjIwNy1Vc2luZy1Qcm9qZWN0cwoKIVtdKGh0dHA6Ly93d3cucnN0dWRpby5jb20vaW1hZ2VzL2RvY3MvcHJvamVjdHNfbmV3LnBuZykKCi0tLQoKIyBSU3R1ZGlvIGlsZSB2ZXJpIHnDvGtsZW1lCgpodHRwczovL3N1cHBvcnQucnN0dWRpby5jb20vaGMvZW4tdXMvYXJ0aWNsZXMvMjE4NjExOTc3LUltcG9ydGluZy1EYXRhLXdpdGgtUlN0dWRpbwoKIVtdKGh0dHBzOi8vc3VwcG9ydC5yc3R1ZGlvLmNvbS9oYy9lbi11cy9hcnRpY2xlX2F0dGFjaG1lbnRzLzIwNjI3NzYxOC9kYXRhLWltcG9ydC1vdmVydmlldy5naWYpCgotLS0KCiMjIEV4Y2VsCgojIyBTUFNTCgojIyBjc3YKCgotLS0KCiMgVmVyaXlpIGfDtnLDvG50w7xsZW1lCgo8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+PGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+U3ByZWFkc2hlZXQgdXNlcnMgdXNpbmcgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL3JzdGF0cz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I3JzdGF0czwvYT46ICB3aGVyZSYjMzk7cyB0aGUgZGF0YT88YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jcnN0YXRzPC9hPiB1c2VycyB1c2luZyBzcHJlYWRzaGVldHM6ICB3aGVyZSYjMzk7cyB0aGUgY29kZT88L3A+Jm1kYXNoOyBMZW9uYXJkIEtpZWZlciAoQGxlbmtpZWZlcikgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9sZW5raWVmZXIvc3RhdHVzLzEwMTU1ODc0NzU1ODA5NTY2NzI/cmVmX3NyYz10d3NyYyU1RXRmdyI+SnVseSA3LCAyMDE4PC9hPjwvYmxvY2txdW90ZT4KCgoKYGBge3IsIHJlc3VsdHM9Im1hcmt1cCJ9CiMgbGlicmFyeShueWNmbGlnaHRzMTMpCiMgc3VtbWFyeShmbGlnaHRzKQpgYGAKCgoKYGBgClZpZXcoZGF0YSkKYGBgCgoKYGBgCmRhdGEKYGBgCgoKYGBgCmhlYWQKYGBgCgoKYGBgCnRhaWwKYGBgCgoKYGBgCmdsaW1wc2UKYGBgCgoKYGBgCnN0cgpgYGAKCgpgYGAKc2tpbXI6OnNraW0oKQpgYGAKCi0tLQoKCiMgVmVyaXlpIGRlxJ9pxZ90aXJtZQoKIyMgVmVyaXlpIGtvZCBpbGUgZGXEn2nFn3RpcmVsaW0KCiMjIFZlcml5aSBla2xlbnRpbGVybGUgZGXEn2nFn3Rpcm1lCgohW10oZmlndXJlcy9jaGFuZ2VfZGF0YS5wbmcpCgoKLS0tCgoKIyMgUlN0dWRpbyBhcmFjxLFsxLHEn8SxeWxhIHJlY29kZQoKKnF1ZXN0aW9uciogcGFrZXRpIGt1bGxhbsSxbGFjYWsKCiFbXShmaWd1cmVzL2xldmVsX3JlY29kZS5wbmcpCgoKLS0tCgoKCmh0dHBzOi8vanViYS5naXRodWIuaW8vcXVlc3Rpb25yL2FydGljbGVzL3JlY29kaW5nX2FkZGlucy5odG1sCgoKIVtdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9qdWJhL3F1ZXN0aW9uci9tYXN0ZXIvcmVzb3VyY2VzL3NjcmVlbnNob3RzL2lyZWNfMS5wbmcpCgoKLS0tCgohW10oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2p1YmEvcXVlc3Rpb25yL21hc3Rlci9yZXNvdXJjZXMvc2NyZWVuc2hvdHMvaXJlY18yLnBuZykKCgotLS0KCiFbXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vanViYS9xdWVzdGlvbnIvbWFzdGVyL3Jlc291cmNlcy9zY3JlZW5zaG90cy9pcmVjXzMucG5nKQoKCi0tLQoKIyBCYXNpdCB0YW7EsW1sYXnEsWPEsSBpc3RhdGlzdGlrbGVyCgpgYGAKc3VtbWFyeSgpCmBgYAoKYGBgCm1lYW4KYGBgCgpgYGAKbWVkaWFuCmBgYAoKYGBgCm1pbgpgYGAKCmBgYAptYXgKYGBgCgpgYGAKc2QKYGBgCgpgYGAKdGFibGUoKQpgYGAKCgpgYGB7ciBkZXNjcmlwdGl2ZSwgZWNobz1UUlVFLCBpbmNsdWRlID0gVFJVRX0KbGlicmFyeShyZWFkcikKaXJpc2RhdGEgPC0gcmVhZF9jc3YoImRhdGEvaXJpcy5jc3YiKQoKam12OjpkZXNjcmlwdGl2ZXMoCiAgICBkYXRhID0gaXJpc2RhdGEsCiAgICB2YXJzID0gIlNlcGFsLkxlbmd0aCIsCiAgICBzcGxpdEJ5ID0gIlNwZWNpZXMiLAogICAgZnJlcSA9IFRSVUUsCiAgICBoaXN0ID0gVFJVRSwKICAgIGRlbnMgPSBUUlVFLAogICAgYmFyID0gVFJVRSwKICAgIGJveCA9IFRSVUUsCiAgICB2aW9saW4gPSBUUlVFLAogICAgZG90ID0gVFJVRSwKICAgIG1vZGUgPSBUUlVFLAogICAgc3VtID0gVFJVRSwKICAgIHNkID0gVFJVRSwKICAgIHZhcmlhbmNlID0gVFJVRSwKICAgIHJhbmdlID0gVFJVRSwKICAgIHNlID0gVFJVRSwKICAgIHNrZXcgPSBUUlVFLAogICAga3VydCA9IFRSVUUsCiAgICBxdWFydCA9IFRSVUUsCiAgICBwY0VxR3IgPSBUUlVFKQpgYGAKCi0tLQoKYGBge3Igc2NhdHRlciwgZWNobz1UUlVFLCBpbmNsdWRlPVRSVUV9CiMgaW5zdGFsbC5wYWNrYWdlcygic2NhdHIiKQoKc2NhdHI6OnNjYXQoCiAgICBkYXRhID0gaXJpc2RhdGEsCiAgICB4ID0gIlNlcGFsLkxlbmd0aCIsCiAgICB5ID0gIlNlcGFsLldpZHRoIiwKICAgIGdyb3VwID0gIlNwZWNpZXMiLAogICAgbWFyZyA9ICJkZW5zIiwKICAgIGxpbmUgPSAibGluZWFyIiwKICAgIHNlID0gVFJVRSkKCmBgYAoKIyMgc3VtbWFyeXRvb2xzCgpodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvc3VtbWFyeXRvb2xzL3ZpZ25ldHRlcy9JbnRyb2R1Y3Rpb24uaHRtbAoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KbGlicmFyeShzdW1tYXJ5dG9vbHMpCnN1bW1hcnl0b29sczo6ZnJlcShpcmlzJFNwZWNpZXMsIHN0eWxlID0gInJtYXJrZG93biIpCmBgYAoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30Kc3VtbWFyeXRvb2xzOjpmcmVxKGlyaXMkU3BlY2llcywgcmVwb3J0Lm5hcyA9IEZBTFNFLCBzdHlsZSA9ICJybWFya2Rvd24iLCBvbWl0LmhlYWRpbmdzID0gVFJVRSkKYGBgCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQp3aXRoKHRvYmFjY28sIHByaW50KGN0YWJsZShzbW9rZXIsIGRpc2Vhc2VkKSwgbWV0aG9kID0gJ3JlbmRlcicpKQpgYGAKCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQp3aXRoKHRvYmFjY28sIAogICAgIHByaW50KGN0YWJsZShzbW9rZXIsIGRpc2Vhc2VkLCBwcm9wID0gJ24nLCB0b3RhbHMgPSBGQUxTRSksIAogICAgICAgICAgIG9taXQuaGVhZGluZ3MgPSBUUlVFLCBtZXRob2QgPSAicmVuZGVyIikpCmBgYAoKCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQpzdW1tYXJ5dG9vbHM6OmRlc2NyKGlyaXMsIHN0eWxlID0gInJtYXJrZG93biIpCmBgYAoKCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQpkZXNjcihpcmlzLCBzdGF0cyA9IGMoIm1lYW4iLCAic2QiLCAibWluIiwgIm1lZCIsICJtYXgiKSwgdHJhbnNwb3NlID0gVFJVRSwgCiAgICAgIG9taXQuaGVhZGluZ3MgPSBUUlVFLCBzdHlsZSA9ICJybWFya2Rvd24iKQpgYGAKCgoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KIyB2aWV3KGRmU3VtbWFyeShpcmlzKSkKCmBgYAoKCiFbXShmaWd1cmVzL2Rmc3VtbWFyeS5wbmcpCgoKCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CmRmU3VtbWFyeSh0b2JhY2NvLCBwbGFpbi5hc2NpaSA9IEZBTFNFLCBzdHlsZSA9ICJncmlkIikKYGBgCgoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KCiMgRmlyc3Qgc2F2ZSB0aGUgcmVzdWx0cwoKaXJpc19zdGF0c19ieV9zcGVjaWVzIDwtIGJ5KGRhdGEgPSBpcmlzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORElDRVMgPSBpcmlzJFNwZWNpZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOID0gZGVzY3IsIHN0YXRzID0gYygibWVhbiIsICJzZCIsICJtaW4iLCAibWVkIiwgIm1heCIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9zZSA9IFRSVUUpCgojIFRoZW4gdXNlIHZpZXcoKSwgbGlrZSBzbzoKCnZpZXcoaXJpc19zdGF0c19ieV9zcGVjaWVzLCBtZXRob2QgPSAicGFuZGVyIiwgc3R5bGUgPSAicm1hcmtkb3duIikKYGBgCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQojIHZpZXcoaXJpc19zdGF0c19ieV9zcGVjaWVzKQpgYGAKCiFbXShmaWd1cmVzL0Rlc2NyaXB0aXZlU3RhdGlzdGljcy5wbmcpCgotLS0KCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CmRhdGEodG9iYWNjbykgIyB0b2JhY2NvIGlzIGFuIGV4YW1wbGUgZGF0YWZyYW1lIGluY2x1ZGVkIGluIHRoZSBwYWNrYWdlCkJNSV9ieV9hZ2UgPC0gd2l0aCh0b2JhY2NvLCAKICAgICAgICAgICAgICAgICAgIGJ5KEJNSSwgYWdlLmdyLCBkZXNjciwgCiAgICAgICAgICAgICAgICAgICAgICBzdGF0cyA9IGMoIm1lYW4iLCAic2QiLCAibWluIiwgIm1lZCIsICJtYXgiKSkpCnZpZXcoQk1JX2J5X2FnZSwgInBhbmRlciIsIHN0eWxlID0gInJtYXJrZG93biIpCmBgYAoKLS0tCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQpCTUlfYnlfYWdlIDwtIHdpdGgodG9iYWNjbywgCiAgICAgICAgICAgICAgICAgICBieShCTUksIGFnZS5nciwgZGVzY3IsICB0cmFuc3Bvc2UgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgc3RhdHMgPSBjKCJtZWFuIiwgInNkIiwgIm1pbiIsICJtZWQiLCAibWF4IikpKQoKdmlldyhCTUlfYnlfYWdlLCAicGFuZGVyIiwgc3R5bGUgPSAicm1hcmtkb3duIiwgb21pdC5oZWFkaW5ncyA9IFRSVUUpCmBgYAoKLS0tCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQp0b2JhY2NvX3N1YnNldCA8LSB0b2JhY2NvWyAsYygiZ2VuZGVyIiwgImFnZS5nciIsICJzbW9rZXIiKV0KZnJlcV90YWJsZXMgPC0gbGFwcGx5KHRvYmFjY29fc3Vic2V0LCBmcmVxKQoKIyB2aWV3KGZyZXFfdGFibGVzLCBmb290bm90ZSA9IE5BLCBmaWxlID0gJ2ZyZXEtdGFibGVzLmh0bWwnKQpgYGAKCi0tLQoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30Kd2hhdC5pcyhpcmlzKQpgYGAKCi0tLQoKYGBge3J9CmZyZXEodG9iYWNjbyRnZW5kZXIsIHN0eWxlID0gJ3JtYXJrZG93bicpCmBgYAoKLS0tCgpgYGB7cn0KcHJpbnQoZnJlcSh0b2JhY2NvJGdlbmRlciksIG1ldGhvZCA9ICdyZW5kZXInKQpgYGAKCi0tLQoKIyMgc2tpbXIKCmBgYApsaWJyYXJ5KHNraW1yKQpza2ltKGRmKQpgYGAKCi0tLQoKIyMgRGF0YUV4cGxvcmVyCgpgYGAKbGlicmFyeShEYXRhRXhwbG9yZXIpCkRhdGFFeHBsb3Jlcjo6Y3JlYXRlX3JlcG9ydChkZikKYGBgCgoKWyFbXShodHRwczovL3N0YXRpYzEuc3F1YXJlc3BhY2UuY29tL3N0YXRpYy81OGVlZjg4NDZhNDk2M2U0Mjk2ODdhNGQvdC81YmRmYzJmYjRkN2E5YzA0ZWU1MGI3YWEvMTU0MTM5MTE2MDcwMi9kYXRhRXhwbG9yZXJHaWZMZy5naWY/Zm9ybWF0PTE1MDB3KV0oaHR0cHM6Ly93d3cubGl0dGxlbWlzc2RhdGEuY29tL2Jsb2cvc2ltcGxlLWVkYSkKCgoKLS0tCgojIyBHcmFmaWtsZXIKCmBgYHtyfQojIGxpYnJhcnkoZ2dwbG90MikKIyBsaWJyYXJ5KG1vc2FpYykKIyBtUGxvdChpcmlzZGF0YSkKYGBgCgotLS0KCmBgYHtyfQpjdGFibGUodG9iYWNjbyRnZW5kZXIsIHRvYmFjY28kc21va2VyLCBzdHlsZSA9ICdybWFya2Rvd24nKQpgYGAKCi0tLQoKYGBge3J9CnByaW50KGN0YWJsZSh0b2JhY2NvJGdlbmRlciwgdG9iYWNjbyRzbW9rZXIpLCBtZXRob2QgPSAncmVuZGVyJykKYGBgCgpgYGAKZGVzY3IodG9iYWNjbywgc3R5bGUgPSAncm1hcmtkb3duJykKCnByaW50KGRlc2NyKHRvYmFjY28pLCBtZXRob2QgPSAncmVuZGVyJywgdGFibGUuY2xhc3NlcyA9ICdzdC1zbWFsbCcpCgpkZlN1bW1hcnkodG9iYWNjbywgc3R5bGUgPSAnZ3JpZCcsIHBsYWluLmFzY2lpID0gRkFMU0UpCgpwcmludChkZlN1bW1hcnkodG9iYWNjbywgZ3JhcGgubWFnbmlmID0gMC43NSksIG1ldGhvZCA9ICdyZW5kZXInKQpgYGAKCgotLS0KCgoKPGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+SGVyZSwgYnVpbGRpbmcgdXAgYSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvZ2dwbG90Mj9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I2dncGxvdDI8L2E+IGFzIHNsb3dseSBhcyBwb3NzaWJsZSwgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL3JzdGF0cz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I3JzdGF0czwvYT4uICBJbmNyZW1lbnRhbCBhZGp1c3RtZW50cy4gIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9yc3RhdHN0ZWFjaGluZ2lkZWFzP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jcnN0YXRzdGVhY2hpbmdpZGVhczwvYT4gPGEgaHJlZj0iaHR0cHM6Ly90LmNvL25VdWxRbDhiUGgiPnBpYy50d2l0dGVyLmNvbS9uVXVsUWw4YlBoPC9hPjwvcD4mbWRhc2g7IEdpbmEgUmV5bm9sZHMgKEBFdmFNYWVSZXkpIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vRXZhTWFlUmV5L3N0YXR1cy8xMDI5MTA0NjU2NzYzNTcyMjI2P3JlZl9zcmM9dHdzcmMlNUV0ZnciPkF1Z3VzdCAxMywgMjAxODwvYT48L2Jsb2NrcXVvdGU+PHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vcGxhdGZvcm0udHdpdHRlci5jb20vd2lkZ2V0cy5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgoKCi0tLQoKClshW10oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2RyZWFtUnMvZXNxdWlzc2UvbWFzdGVyL21hbi9maWd1cmVzL2VzcXVpc3NlLmdpZildKGh0dHBzOi8vZ2l0aHViLmNvbS9kcmVhbVJzL2VzcXVpc3NlKQoKCjxibG9ja3F1b3RlIGNsYXNzPSJ0d2l0dGVyLXR3ZWV0IiBkYXRhLWxhbmc9ImVuIj48cCBsYW5nPSJlbiIgZGlyPSJsdHIiPkRyZWFtaW5nIG9mIGEgZmFuY3kgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL1JzdGF0cz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I1JzdGF0czwvYT4gPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL2dncGxvdD9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I2dncGxvdDwvYT4gPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL2RhdGF2aXo/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNkYXRhdml6PC9hPiBidXQgc3RpbGwgc2NhcmVkIG9mIHR5cGluZyA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvY29kZT9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I2NvZGU8L2E+PyA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL19wdmljdG9ycj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5AX3B2aWN0b3JyPC9hPiBlc3F1aXNzZSBwYWNrYWdlIGhhcyB5b3UgY292ZXJlZCA8YSBocmVmPSJodHRwczovL3QuY28vMXZJRFhjVkFBRiI+aHR0cHM6Ly90LmNvLzF2SURYY1ZBQUY8L2E+IDxhIGhyZWY9Imh0dHBzOi8vdC5jby9SbFRrcHRuck52Ij5waWMudHdpdHRlci5jb20vUmxUa3B0bnJOdjwvYT48L3A+Jm1kYXNoOyBSYWRvc2xhdyBQYW5jemFrIChAUlBhbmN6YWspIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vUlBhbmN6YWsvc3RhdHVzLzEwNDcwMTk1ODg2NTgwNDA4MzI/cmVmX3NyYz10d3NyYyU1RXRmdyI+T2N0b2JlciAyLCAyMDE4PC9hPjwvYmxvY2txdW90ZT4KPHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vcGxhdGZvcm0udHdpdHRlci5jb20vd2lkZ2V0cy5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgoKCgoKCgoKCgoKLS0tCgojIFJjbWRyCgpgYGAKbGlicmFyeShSY21kcikKClJjbWRyOjpDb21tYW5kZXIoKQoKYGBgCgoKLSBBIENvbXBhcmF0aXZlIFJldmlldyBvZiB0aGUgUiBDb21tYW5kZXIgR1VJIGZvciBSCgpodHRwOi8vcjRzdGF0cy5jb20vYXJ0aWNsZXMvc29mdHdhcmUtcmV2aWV3cy9yLWNvbW1hbmRlci8KCgotLS0KCiMgamFtb3ZpCgpodHRwczovL3d3dy5qYW1vdmkub3JnLwoKIVshW10oaHR0cHM6Ly93d3cuamFtb3ZpLm9yZy9hc3NldHMvbWFpbi1zY3JlZW5zaG90LnBuZyldKGh0dHBzOi8vd3d3LmphbW92aS5vcmcvKQoKCmh0dHBzOi8vYmxvZy5qYW1vdmkub3JnLzIwMTgvMDcvMzAvcmouaHRtbAoKIVshW10oaHR0cHM6Ly9ibG9nLmphbW92aS5vcmcvYXNzZXRzL2ltYWdlcy9yai5wbmcpXShodHRwczovL2Jsb2cuamFtb3ZpLm9yZy8yMDE4LzA3LzMwL3JqLmh0bWwpCgotLS0KCiMgU29ucmFraSBLb251bGFyCgotIFJTdHVkaW8gaWxlIEdpdEh1YgotIEhpcG90ZXogdGVzdGxlcmkKLSBSIE1hcmtkb3duIHZlIFIgTm90ZWJvb2sgaWxlIHRla3JhcmxhbmFiaWxpciByYXBvcgoKCi0tLQoKIyBEacSfZXIga29kbGFyCgotIERpxJ9lciBrb2RsYXIgacOnaW4gYmFrxLFuxLF6OiBbaHR0cHM6Ly9zYmFsY2kuZ2l0aHViLmlvL10oaHR0cHM6Ly9zYmFsY2kuZ2l0aHViLmlvLykKCgotLS0KCiMgR2VyaSBCaWxkaXJpbQoKLSBHZXJpIGJpbGRpcmltIGnDp2luIHTEsWtsYXnEsW7EsXo6IF9bR2VyaSBiaWxkaXJpbSBmb3JtdV0oaHR0cHM6Ly9nb28uZ2wvZm9ybXMvWWpHWjVESGd0UGxSMVJuQjMpXwoKCi0tLQoKPHNjcmlwdCBpZD0iZHNxLWNvdW50LXNjciIgc3JjPSIvL2h0dHBzLXNiYWxjaS1naXRodWItaW8uZGlzcXVzLmNvbS9jb3VudC5qcyIgYXN5bmM+PC9zY3JpcHQ+Cgo8ZGl2IGlkPSJkaXNxdXNfdGhyZWFkIj48L2Rpdj4KPHNjcmlwdD4KCi8qKgoqICBSRUNPTU1FTkRFRCBDT05GSUdVUkFUSU9OIFZBUklBQkxFUzogRURJVCBBTkQgVU5DT01NRU5UIFRIRSBTRUNUSU9OIEJFTE9XIFRPIElOU0VSVCBEWU5BTUlDIFZBTFVFUyBGUk9NIFlPVVIgUExBVEZPUk0gT1IgQ01TLgoqICBMRUFSTiBXSFkgREVGSU5JTkcgVEhFU0UgVkFSSUFCTEVTIElTIElNUE9SVEFOVDogaHR0cHM6Ly9kaXNxdXMuY29tL2FkbWluL3VuaXZlcnNhbGNvZGUvI2NvbmZpZ3VyYXRpb24tdmFyaWFibGVzKi8KLyoKdmFyIGRpc3F1c19jb25maWcgPSBmdW5jdGlvbiAoKSB7CnRoaXMucGFnZS51cmwgPSBQQUdFX1VSTDsgIC8vIFJlcGxhY2UgUEFHRV9VUkwgd2l0aCB5b3VyIHBhZ2UncyBjYW5vbmljYWwgVVJMIHZhcmlhYmxlCnRoaXMucGFnZS5pZGVudGlmaWVyID0gUEFHRV9JREVOVElGSUVSOyAvLyBSZXBsYWNlIFBBR0VfSURFTlRJRklFUiB3aXRoIHlvdXIgcGFnZSdzIHVuaXF1ZSBpZGVudGlmaWVyIHZhcmlhYmxlCn07CiovCihmdW5jdGlvbigpIHsgLy8gRE9OJ1QgRURJVCBCRUxPVyBUSElTIExJTkUKdmFyIGQgPSBkb2N1bWVudCwgcyA9IGQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CnMuc3JjID0gJ2h0dHBzOi8vaHR0cHMtc2JhbGNpLWdpdGh1Yi1pby5kaXNxdXMuY29tL2VtYmVkLmpzJzsKcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGltZXN0YW1wJywgK25ldyBEYXRlKCkpOwooZC5oZWFkIHx8IGQuYm9keSkuYXBwZW5kQ2hpbGQocyk7Cn0pKCk7Cjwvc2NyaXB0Pgo8bm9zY3JpcHQ+UGxlYXNlIGVuYWJsZSBKYXZhU2NyaXB0IHRvIHZpZXcgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZGlzcXVzLmNvbS8/cmVmX25vc2NyaXB0Ij5jb21tZW50cyBwb3dlcmVkIGJ5IERpc3F1cy48L2E+PC9ub3NjcmlwdD4KCi0tLQoKCg==